/*
匿名函数。
 
	[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
	    // 函数体
	}
捕获列表：可以理解成参数的一种类型，有值捕获、引用捕获，以上两种捕获可以用=、&代替（隐式捕获）

表达式捕获：上面提到的值捕获、引用捕获都是已经在外层作用域声明的变量，因此这些捕获方式捕获的均为左值，而不能捕获右值。
C++14 给与了我们方便，允许捕获的成员用任意的表达式进行初始化，这就允许了右值的捕获，被声明的捕获变量类型会根据表达式进行判断，
判断方式与使用 auto 本质上是相同的：

 */
#include "include.h"
//值捕获
void lambda_1()
{
	int add1=1000;
	auto fun1=[add1](int a)->int{
		return add1+a;
	};
	add1=10;
	cout<<"fun1(1000) = "<<fun1(1000)<<" add1 = "<<add1<<endl;
//隐式捕获
	int add2=1000;
	auto fun2=[=](int a){
		return add1+add2+a;
	};
	add2=10;
	cout<<"fun2(1000) = "<<fun2(1000)<<" add2 = "<<add2<<endl;
}

//引用捕获
void lambda_2()
{
	int add1=1000;
	auto fun1=[&add1](int a){
		return add1+a;
	};
	add1=10;
	cout<<"fun1(1000) = "<<fun1(1000)<<" add1 = "<<add1<<endl;
//隐式捕获
	int add2=1000;
	auto fun2=[&](int a){
		return add1+add2+a;
	};
	add2=10;
	cout<<"fun2(1000) = "<<fun2(1000)<<" add2 = "<<add2<<endl;
}
void test_lambda()
{
	lambda_1();
	lambda_2();
}


